package main

import (
	"amtf-laoyu-go/aa"
	"fmt"
	"os"
	"os/signal"
	"path/filepath"
	"runtime"
	"sync"
	"syscall"
	"time"
)

const CheckInterval time.Duration = 25 * time.Millisecond

var (
	a窗口字典    = make(map[uintptr]*aa.A窗口)
	mu       sync.Mutex
	stopChan = make(chan struct{})
)

func main() {
	予强退()
	aa.A予控制台()

	_, filename, _, _ := runtime.Caller(0)
	rootPath := filepath.Dir(filename)
	fmt.Printf("📁 程序根路径: %s\n", rootPath)

	aa.A予托盘(func() {
		// 停止定时检测协程
		close(stopChan)
		// 等待协程退出
		time.Sleep(50 * time.Millisecond)
		// 触发退出事件，让主线程消息循环退出
		aa.TriggerExitEvent()
	}, rootPath)

	fmt.Println("=== 窗口置顶工具 ===")
	fmt.Println("快捷键: Ctrl+Y（切换窗口置顶/取消）")
	fmt.Println("功能: 图标显示在置顶窗口标题栏上方")
	fmt.Println("退出: 点击托盘【退出】按钮")
	fmt.Println("----------------------------------------")

	// 8. 启动定时检测协程（不影响主线程）
	go 看窗口位置()
	// 这里会循环监听热键事件👇
	aa.A予热键(A热键执行)
	清理()
	fmt.Println("✅ 程序已完全退出")
}

func 予强退() {
	// 提前注册信号监听（捕获 Ctrl+C）
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	go func() {
		<-sigChan
		fmt.Println("\n⚠️  收到终止信号（Ctrl+C 或强制终止）")
		清理()
		os.Exit(1)
	}()
}
func A热键执行(foregroundHWND uintptr) {
	mu.Lock()
	defer mu.Unlock()
	if foregroundHWND == 0 {
		fmt.Println("⚠️ 未找到激活窗口")
		return
	}

	窗口, 已存在 := a窗口字典[foregroundHWND]
	if 已存在 {
		窗口.A切换窗口置顶()
	} else {
		窗口, _ := aa.A新建A窗口(foregroundHWND)
		a窗口字典[foregroundHWND] = 窗口
		窗口.A切换窗口置顶()
	}
}

func 看窗口位置() {
	ticker := time.NewTicker(CheckInterval)
	defer ticker.Stop()
	for {
		select {
		case <-ticker.C:
			mu.Lock()
			for hwnd, aWindow := range a窗口字典 {
				if err := aWindow.A更新图标位置(); err != nil {
					aWindow.A销毁()
					delete(a窗口字典, hwnd)
					fmt.Printf("⚠️ 窗口已关闭，清理图标 (HWND: %d)\n", hwnd)
				}
			}
			mu.Unlock()
		case <-stopChan:
			return
		}
	}
}

func 清窗口() {
	fmt.Printf("清窗口 ing👇\n")
	mu.Lock()
	defer mu.Unlock()

	for hwnd, aWindow := range a窗口字典 {
		aWindow.A销毁()
		delete(a窗口字典, hwnd)
		fmt.Printf("🗑️  清理图标窗口 (HWND: %d)\n", hwnd)
	}
}

func 清理() {
	fmt.Println("\n🔄 开始清理资源...")
	// 1. 安全关闭 stopChan（仅在未关闭时关闭）
	select {
	case <-stopChan:
		// 通道已关闭，不做任何操作
	default:
		close(stopChan) // 通道未关闭，执行关闭
	}
	// 2. 注销全局热键
	aa.UnregisterHotkey()
	清窗口()
	fmt.Println("✅ 资源清理完成")
}
